package com.jxc.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jxc.dao.BaseDaoI;
import com.jxc.model.po.GoodsType;
import com.jxc.model.po.Repertory;
import com.jxc.model.po.User;
import com.jxc.model.vo.DataGrid;
import com.jxc.model.vo.VGoodsType;
import com.jxc.service.GoodsTypeServiceI;

@Service("goodsTypeService")
public class GoodsTypeServiceImpl implements GoodsTypeServiceI {

	@Autowired
	private BaseDaoI<GoodsType> goodsTypeDao;
	@Autowired
	private BaseDaoI<User> userDao;

	@Override
	public List<VGoodsType> combobox(VGoodsType vgoodsType) {
		return this.changeModel(this.find(vgoodsType));
	}

	@Override
	public DataGrid datagrid(VGoodsType vgoodsType) {
		DataGrid dg = new DataGrid();
		dg.setRows(this.changeModel(this.findList(vgoodsType)));
		dg.setTotal(this.total(vgoodsType));
		return dg;
	}

	@Override
	public void delete(String ids) {
		if (ids != null) {
			for (String id : ids.split(",")) {
				if (!id.trim().equals("0")) {
					GoodsType goodsType = goodsTypeDao.get(GoodsType.class, Long.parseLong(id.trim()));
					if (goodsType != null) {
						goodsType.setIsDelete(true);
						goodsTypeDao.update(goodsType);
					}
				}
			}
		}
	}

	@Override
	public void save(VGoodsType vgoodsType) {
		GoodsType goodsType = new GoodsType();
		BeanUtils.copyProperties(vgoodsType, goodsType);
		if (vgoodsType.getUid() != null) {
			User u = userDao.get(User.class,vgoodsType.getUid());
			goodsType.setUser(u);
		}
		goodsType.setIsDelete(false);
		this.goodsTypeDao.save(goodsType);
	}

	@Override
	public void update(VGoodsType vgoodsType) {
		GoodsType goodsType = goodsTypeDao.get(GoodsType.class, vgoodsType.getId());
		BeanUtils.copyProperties(vgoodsType, goodsType, new String[] { "id", "isDelete" });
		if (vgoodsType.getUid() != null) {
			User u = userDao.get(User.class,vgoodsType.getUid());
			goodsType.setUser(u);
		}
		this.goodsTypeDao.update(goodsType);
	}

	private List<VGoodsType> changeModel(List<GoodsType> goodsTypes) {
		List<VGoodsType> vgoodsTypes = new ArrayList<VGoodsType>();
		if (goodsTypes != null && goodsTypes.size() > 0) {
			for (GoodsType goodsType : goodsTypes) {
				VGoodsType vgoodsType = new VGoodsType();
				BeanUtils.copyProperties(goodsType, vgoodsType);
				vgoodsTypes.add(vgoodsType);
			}
		}
		return vgoodsTypes;
	}

	private List<GoodsType> find(VGoodsType vgoodsType) {
		String hql = "from GoodsType t where 1=1 ";

		List<Object> values = new ArrayList<Object>();
		hql = addWhere(vgoodsType, hql, values);

		if (vgoodsType.getSort() != null && vgoodsType.getOrder() != null) {
			hql += " order by " + vgoodsType.getSort() + " " + vgoodsType.getOrder();
		}
		return goodsTypeDao.find(hql, values);
	}
	
	private List<GoodsType> findList(VGoodsType vgoodsType) {
		String hql = "from GoodsType t where 1=1 ";

		List<Object> values = new ArrayList<Object>();
		hql = addWhere(vgoodsType, hql, values);

		if (vgoodsType.getSort() != null && vgoodsType.getOrder() != null) {
			hql += " order by " + vgoodsType.getSort() + " " + vgoodsType.getOrder();
		}
		return goodsTypeDao.find(hql, values,vgoodsType.getPage(),vgoodsType.getRows());
	}

	private Long total(VGoodsType vgoodsType) {
		String hql = "select count(*) from GoodsType t where 1=1 ";
		List<Object> values = new ArrayList<Object>();
		hql = addWhere(vgoodsType, hql, values);
		return goodsTypeDao.count(hql, values);
	}

	private String addWhere(VGoodsType vgoodsType, String hql, List<Object> values) {
		if (vgoodsType.getName() != null && !vgoodsType.getName().trim().equals("")) {
			hql += " and t.name like ? ";
			values.add("%%" + vgoodsType.getName().trim() + "%%");
		}
		if (vgoodsType.getUid() != null) {
			hql += " and t.user.id  = ? ";
			values.add(vgoodsType.getUid());
		}
		hql += " and t.isDelete = 0 ";
		return hql;
	}

}
